package com.example.mysql.学习笔记.高级.数据库的优化之索引.索引优化与查询优化;

public class 覆盖索引 {
}

/**
 * 8 优先考虑覆盖索引
 *
 * #: order by时不limit，索引失效.
 * #创建索引
 * CREATE INDEX idx_age_classid_name ON student (age, classid,NAME);
 * #不限制,索引失效
 * EXPIAIN SELECT SQL_NO_CACHE(不使用缓存) * FROM student ORDER BY age, classid;//不会使用索引
 * EXPLAIN SELECT SQL_NO_CACHE age, classid, NAME, id FROM student ORDER BY age, classid;//会使用索引
 *       因为此索引拥有  所用需要的字段，在索引中查询，
 *       不需要对更多不需要的字段进行缓存，而且每个页也有更多的数据，跟家矮胖，查询效率更高
 *
 *
 * 8.1什么是覆盖索引?
 * 理解方式一 :
 * 索引是高效找到行的一个方法，但是一般数据库也能使用索引找到一个列的数据，因此它不必读取整个行。
 * 毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。
 * 一个索引包含了满足查询结果的数据就叫做覆盖索引。
 * 理解方式二:
 * 非聚簇复合索引的一种形式，它包括在查询里的SELECT、JOIN和WHERE子句用到的所有列
 * (即建索引的字段正好是覆盖查询条件中所涉及的字段)。
 * 简单说就是，索引列+主键包含SELECT 到FROM之 间查询的列。
 *
 * 8.2覆盖索引的利弊
 * 好处:
 * 1.避免Innodb表进行索引的二次查询(回表)
 * Innodb是以聚集索弓的顺序来存储的，对于Innodb来说，二级索引在叶子节点中所保存的是行的主键信息,
 * 如果是用二级索引查询数据，在查找到相应的键值后，还需通过主键进行二次查询才能获取我们真实所需要的数据。
 * 在覆盖索引中，二级索引的键值中可以获取所要的数据，
 * 避免了 对主键的二次查询，减少 了I0操作，提升了查询效率。
 * 2.可以把随机I/O变成顺序I/O加快查询效率    .
 *     随机I/O：查询的时候如果是个范围 那么回表的时候是b+数随机访问的随机I/O，
 *     顺序I/O：如果联合索引包括所有东西，不需要回表，并且在二级索引中是顺序存储了，就是顺序I/O了
 * 由于覆盖索引是按键值的顺序存储的，对于I0密集型的范围查找来说，
 * 对比随机从磁盘读取每-行的数据I0要少的多,
 * 因此利用覆盖索引在访问时也可以把磁盘的随机读取的I0转变成索引查找的顺序I0。
 * 由于覆盖索引可以减少树的搜索次数，显著提升查询性能，所以使用覆盖索引是- -个常用的性能优化手段。
 * 弊端:
 *   索引字段的维护总是有代价的。因此，在建立冗余索引来支持覆盖索弓时就需要权衡考虑了。
 *   这是业务DBA,或者称为业务数据架构师的工作。
 *
 *
 */
